package transaction01;

import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 利用JDBC实现转账业务
 *  JDBC操作事务：
 *      Connection中的方法：
 *      setAutoCommit(false):关闭数据库的自动提交,相当于START TRANSACTION;
 *       commit():将操作更改的数据永久应用到数据库
 *       rollback():回滚操作,将数据恢复到执行SQL语句之前的状态
 */
public class TransactionDemo01 {
    @Test
    public void testDemo() {
        //1.获取连接
        Connection conn = JDBCUtils.getConnection();
        //2.使用预编译SQL
        PreparedStatement ps = null;
        try {
            conn.setAutoCommit(false);//关闭自动提交

            ps = conn.prepareStatement("UPDATE account SET money = money + ? WHERE id = ?");
            ps.setDouble(1, -1000);//张三转出1000
            ps.setInt(2, 1);
            ps.executeUpdate();

//           int i = 2 / 0;

            ps.setDouble(1, 1000);//李四转入1000
            ps.setInt(2, 2);
            ps.executeUpdate();

            //提交事务
            conn.commit();
        } catch (SQLException e) {
            try {
                conn.rollback();//回滚操作，还原到之前的数据
            } catch (SQLException ex) {
                throw new RuntimeException(ex);
            }
            throw new RuntimeException(e);
        }finally {//无论操作是否成功都要释放资源
            JDBCUtils.release(conn, ps, null);
        }

    }
}
